home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacOS 8 Resources / Developer Tools / Mac OS 8 Interfaces & Libraries / Interfaces / CIncludes / ConditionalMacros.h < prev    next >
C/C++ Source or Header  |  1996-05-01  |  14KB  |  351 lines

  1. /*
  2.      File:        ConditionalMacros.h
  3.  
  4.      Contains:    Set up for compiler independent conditionals
  5.  
  6.      Version:    Technology:    Universal Interface Files 3.0dx
  7.                  Release:    Universal Interfaces 3.0d3 on Copland DR1
  8.  
  9.      Copyright:    © 1984-1996 by Apple Computer, Inc.  All rights reserved.
  10.  
  11.      Bugs?:        If you find a problem with this file, send the file and version
  12.                  information (from above) and the problem description to:
  13.  
  14.                      Internet:    apple.bugs@applelink.apple.com
  15.                      AppleLink:    APPLE.BUGS
  16.  
  17. */
  18. #ifndef __CONDITIONALMACROS__
  19. #define __CONDITIONALMACROS__
  20.  
  21. /*
  22. ***************************************************************************************************
  23.     UNIVERSAL_INTERFACES_VERSION
  24.     
  25.         0x0300 => version 3.0
  26.         0x0210 => version 2.1
  27.         This conditional did not exist prior to version 2.1
  28. ***************************************************************************************************
  29. */
  30. #define UNIVERSAL_INTERFACES_VERSION 0x0300
  31. /*
  32. ***************************************************************************************************
  33.     GENERATINGPOWERPC        - Compiler is generating PowerPC instructions
  34.     GENERATING68K            - Compiler is generating 68k family instructions
  35.  
  36.         Invariant:
  37.             GENERATINGPOWERPC != GENERATING68K
  38. ***************************************************************************************************
  39. */
  40. #ifdef GENERATINGPOWERPC
  41. #ifndef GENERATING68K
  42. #define GENERATING68K !GENERATINGPOWERPC
  43. #endif
  44. #endif
  45. #ifdef GENERATING68K
  46. #ifndef GENERATINGPOWERPC
  47. #define GENERATINGPOWERPC !GENERATING68K
  48. #endif
  49. #endif
  50. #ifndef GENERATINGPOWERPC
  51. #if defined(powerc) || defined(__powerc)
  52. #define GENERATINGPOWERPC 1
  53. #else
  54. #define GENERATINGPOWERPC 0
  55. #endif
  56. #endif
  57. #ifndef GENERATING68K
  58. #if GENERATINGPOWERPC
  59. #define GENERATING68K 0
  60. #else
  61. #define GENERATING68K 1
  62. #endif
  63. #endif
  64. /*
  65. ***************************************************************************************************
  66.     GENERATING68881            - Compiler is generating mc68881 floating point instructions
  67.     
  68.         Invariant:
  69.             GENERATING68881 => GENERATING68K
  70. ***************************************************************************************************
  71. */
  72. #if GENERATING68K
  73. #if defined(applec) || defined(__SC__)
  74. #ifdef mc68881
  75. #define GENERATING68881 1
  76. #endif
  77. #else
  78. #ifdef __MWERKS__
  79. #if __MC68881__
  80. #define GENERATING68881 1
  81. #endif
  82. #endif
  83. #endif
  84. #endif
  85. #ifndef GENERATING68881
  86. #define GENERATING68881 0
  87. #endif
  88. /*
  89. ***************************************************************************************************
  90.     GENERATINGCFM            - Code being generated assumes CFM calling conventions
  91.     CFMSYSTEMCALLS            - No A-traps.  Systems calls are made using CFM and UPP's
  92.  
  93.         Invariants:
  94.             GENERATINGPOWERPC => GENERATINGCFM
  95.             GENERATINGPOWERPC => CFMSYSTEMCALLS
  96.             CFMSYSTEMCALLS => GENERATINGCFM
  97. ***************************************************************************************************
  98. */
  99. #if GENERATINGPOWERPC || defined(__CFM68K__)
  100. #define GENERATINGCFM 1
  101. #define CFMSYSTEMCALLS 1
  102. #else
  103. #define GENERATINGCFM 0
  104. #define CFMSYSTEMCALLS 0
  105. #endif
  106. /*
  107. ***************************************************************************************************
  108.     One or none of the following BUILDING_~= conditionals is expected to be set during 
  109.     compilation (e.g. MrC -d BUILDING_FOR_SYSTEM7), the others should be left undefined.
  110.     If none is set, BUILDING_FOR_SYSTEM7_AND_SYSTEM8 is used.
  111.     
  112.         BUILDING_FOR_SYSTEM7                - Code is intended to run on System 7.x machine or earlier .
  113.         BUILDING_FOR_SYSTEM7_AND_SYSTEM8    - Code is intended to run on System 7 or Copland.
  114.         BUILDING_FOR_SYSTEM8                - Code is intended to run on Copland only.
  115.         BUILDING_PREEMPTIVE_CODE            - Code is intended to run as Copland server or driver.
  116.         
  117.     The following conditionals are set up based on which of the BUILDING_~= flag (above) was specified.
  118.     They are used in throughout the interface files to conditionalize declarations.
  119.     
  120.         FOR_SYSTEM7_ONLY                    - In System 7. Not in Copland.
  121.         FOR_SYSTEM7_AND_SYSTEM8_DEPRECATED    - In System 7. Works in Copland, but there is a better way.
  122.         FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE    - In System 7. In Copland, but only for cooperative tasks.
  123.         FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE    - In System 7. In Copland.
  124.         FOR_SYSTEM8_COOPERATIVE                - Not in System 7.  In Copland, but only for cooperative tasks.
  125.         FOR_SYSTEM8_PREEMPTIVE                - Not in System 7.  In Copland.
  126.         
  127.         FOR_OPAQUE_SYSTEM_DATA_STRUCTURES    - Always true for system 8, but can be set by developer to
  128.                                               true or false for System 7.  When true, the contents of 
  129.                                               many system data structures are removed from the interfaces.
  130.                                               In the future, the Mac OS will have fewer data structures 
  131.                                               shared between applications and the system.  The problem
  132.                                               with shared data is 1) the system has to poll the data
  133.                                               to detect changes made by an application, 2) it prevents
  134.                                               data structures from being changed in the future.
  135.                                               Procedural interface will be used instead.
  136.                                               
  137.         FOR_PTR_BASED_AE                    - This is a temporary fix for Copland DR1.  It is needed to
  138.                                               distinguish between pointer based and handle based AppleEvents.
  139.                                               If you are in the case of BUILDING_FOR_SYSTEM7_AND_SYSTEM8
  140.                                               and want to use new pointer base AppleEvents, you will need to
  141.                                               -d FOR_PTR_BASED_AE on your compiler command line.
  142.         
  143. ***************************************************************************************************
  144. */
  145. #if 0
  146. /* extra if statement is to work around a bug in PPCAsm 1.2a2 */
  147. #elif defined(BUILDING_FOR_SYSTEM7)
  148. #ifndef FOR_OPAQUE_SYSTEM_DATA_STRUCTURES
  149. #define FOR_OPAQUE_SYSTEM_DATA_STRUCTURES 0
  150. #endif
  151. #define FOR_PTR_BASED_AE 0
  152. #define FOR_SYSTEM7_ONLY 1
  153. #define FOR_SYSTEM7_AND_SYSTEM8_DEPRECATED 1
  154. #define FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE 1
  155. #define FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE 1
  156. #define FOR_SYSTEM8_COOPERATIVE 0
  157. #define FOR_SYSTEM8_PREEMPTIVE 0
  158. #elif defined(BUILDING_FOR_SYSTEM7_AND_SYSTEM8)
  159. #ifndef FOR_OPAQUE_SYSTEM_DATA_STRUCTURES
  160. #define FOR_OPAQUE_SYSTEM_DATA_STRUCTURES 1
  161. #endif
  162. #ifndef FOR_PTR_BASED_AE
  163. #define FOR_PTR_BASED_AE 0
  164. #endif
  165. #define FOR_SYSTEM7_ONLY 0
  166. #define FOR_SYSTEM7_AND_SYSTEM8_DEPRECATED 1
  167. #define FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE 1
  168. #define FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE 1
  169. #define FOR_SYSTEM8_COOPERATIVE 1
  170. #define FOR_SYSTEM8_PREEMPTIVE 1
  171. #elif defined(BUILDING_FOR_SYSTEM7_AND_SYSTEM)
  172. /* xlc has a limit of 31 chars for command line defines, so redefine above clipped to 31 chars */
  173. #ifndef FOR_OPAQUE_SYSTEM_DATA_STRUCTURES
  174. #define FOR_OPAQUE_SYSTEM_DATA_STRUCTURES 1
  175. #endif
  176. #ifndef FOR_PTR_BASED_AE
  177. #define FOR_PTR_BASED_AE 0
  178. #endif
  179. #define FOR_SYSTEM7_ONLY 0
  180. #define FOR_SYSTEM7_AND_SYSTEM8_DEPRECATED 1
  181. #define FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE 1
  182. #define FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE 1
  183. #define FOR_SYSTEM8_COOPERATIVE 1
  184. #define FOR_SYSTEM8_PREEMPTIVE 1
  185. #elif defined(BUILDING_FOR_SYSTEM8)
  186. #define FOR_OPAQUE_SYSTEM_DATA_STRUCTURES 1
  187. #define FOR_PTR_BASED_AE 1
  188. #define FOR_SYSTEM7_ONLY 0
  189. #define FOR_SYSTEM7_AND_SYSTEM8_DEPRECATED 0
  190. #define FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE 1
  191. #define FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE 1
  192. #define FOR_SYSTEM8_COOPERATIVE 1
  193. #define FOR_SYSTEM8_PREEMPTIVE 1
  194. #elif defined(BUILDING_PREEMPTIVE_CODE)
  195. #define FOR_OPAQUE_SYSTEM_DATA_STRUCTURES 1
  196. #define FOR_PTR_BASED_AE 1
  197. #define FOR_SYSTEM7_ONLY 0
  198. #define FOR_SYSTEM7_AND_SYSTEM8_DEPRECATED 0
  199. #define FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE 0
  200. #define FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE 1
  201. #define FOR_SYSTEM8_COOPERATIVE 0
  202. #define FOR_SYSTEM8_PREEMPTIVE 1
  203. #else
  204. /* default is BUILDING_FOR_SYSTEM7_AND_SYSTEM8  */
  205. #define FOR_OPAQUE_SYSTEM_DATA_STRUCTURES 1
  206. #ifndef FOR_PTR_BASED_AE
  207. #define FOR_PTR_BASED_AE 0
  208. #endif
  209. #define FOR_SYSTEM7_ONLY 0
  210. #define FOR_SYSTEM7_AND_SYSTEM8_DEPRECATED 1
  211. #define FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE 1
  212. #define FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE 1
  213. #define FOR_SYSTEM8_COOPERATIVE 1
  214. #define FOR_SYSTEM8_PREEMPTIVE 1
  215. #endif
  216. /*
  217. ***************************************************************************************************
  218.  
  219.     OLDROUTINENAMES            - "Old" names for Macintosh system calls are allowed in source code.
  220.                               (e.g. DisposPtr instead of DisposePtr). The names of system routine
  221.                               are now more sensitive to change because CFM binds by name.  In the 
  222.                               past, system routine names were compiled out to just an A-Trap.  
  223.                               Macros have been added that each map an old name to its new name.  
  224.                               This allows old routine names to be used in existing source files,
  225.                               but the macros only work if OLDROUTINENAMES is true.  This support
  226.                               will be removed in the near future.  Thus, all source code should 
  227.                               be changed to use the new names! You can set OLDROUTINENAMES to false
  228.                               to see if your code has any old names left in it.
  229.     
  230.     OLDROUTINELOCATIONS     - "Old" location of Macintosh system calls are used.  For example, c2pstr 
  231.                               has been moved from Strings to TextUtils.  It is conditionalized in
  232.                               Strings with OLDROUTINELOCATIONS and in TextUtils with !OLDROUTINELOCATIONS.
  233.                               This allows developers to upgrade to newer interface files without suddenly
  234.                               all their code not compiling becuase of "incorrect" includes.  But, it
  235.                               allows the slow migration of system calls to more understandable file
  236.                               locations.  OLDROUTINELOCATIONS currently defaults to true, but eventually
  237.                               will default to false.
  238.  
  239. ***************************************************************************************************
  240. */
  241. #ifndef OLDROUTINENAMES
  242. #define OLDROUTINENAMES 0
  243. #endif
  244. #ifndef OLDROUTINELOCATIONS
  245. #define OLDROUTINELOCATIONS 0
  246. #endif
  247. /*
  248. ***************************************************************************************************
  249.     C specific conditionals
  250.  
  251.     CGLUESUPPORTED            - Interface library will support "C glue" functions (function names
  252.                               are: all lowercase, use C strings instead of pascal strings, use 
  253.                               Point* instead of Point).
  254.  
  255.     PRAGMA_ALIGN_SUPPORTED    - Compiler supports "#pragma align=..." directives. The only compilers that
  256.                               can get by without supporting the pragma are old classic 68K compilers
  257.                               that will only be used to compile older structs that have 68K alignment
  258.                               anyways.  
  259.     
  260.     PRAGMA_IMPORT_SUPPORTED    - Compiler supports "#pragma import on/off" directives.  These directives
  261.                               were introduced with the SC compiler which supports CFM 68K.  The directive
  262.                               is used to tell the compiler which functions will be called through a 
  263.                               transition vector (instead of a simple PC-relative offset).  This allows 
  264.                               the compiler to generate better code.  Since System Software functions are
  265.                               implemented as shared libraries and called through transition vectors,
  266.                               all System Software functions are declared with "#pragma import on".
  267.                               
  268.         Invariants:
  269.             PRAGMA_IMPORT_SUPPORTED => CFMSYSTEMCALLS
  270.             GENERATINGPOWERPC => PRAGMA_ALIGN_SUPPORTED
  271. ***************************************************************************************************
  272. */
  273. #ifndef CGLUESUPPORTED
  274. #ifdef THINK_C
  275. #define CGLUESUPPORTED 0
  276. #else
  277. #define CGLUESUPPORTED 1
  278. #endif
  279. #endif
  280. /*
  281.     All PowerPC compilers support pragma align
  282.     For 68K, only Metrowerks and SC 8.0 support pragma align 
  283. */
  284. #ifndef PRAGMA_ALIGN_SUPPORTED
  285.     #if GENERATINGPOWERPC || defined(__MWERKS__) || ( defined(__SC__) && (__SC__ >= 0x0800) )
  286.         #define  PRAGMA_ALIGN_SUPPORTED 1
  287.     #else
  288.         #define  PRAGMA_ALIGN_SUPPORTED 0
  289.     #endif
  290. #endif
  291. /* Currently, only Metowerks CW7 and later, and SC 8.0 or later support pragma import  */
  292. #ifndef PRAGMA_IMPORT_SUPPORTED
  293.     #if ( defined(__MWERKS__) && (__MWERKS__ >= 0x0700) ) || ( defined(__SC__) && (__SC__ >= 0x0800) )
  294.         #define  PRAGMA_IMPORT_SUPPORTED 1
  295.     #else
  296.         #define  PRAGMA_IMPORT_SUPPORTED 0
  297.     #endif
  298. #endif
  299. /*
  300. ***************************************************************************************************
  301.     Set up old "USES..." conditionals to support 1.0 universal interface files
  302.  
  303.     The USESxxx names are old, but cannot be removed yet because source code that
  304.     uses them might still compile, but do the wrong thing. 
  305. ***************************************************************************************************
  306. */
  307. #ifndef USES68KINLINES
  308. #define USES68KINLINES GENERATING68K
  309. #endif
  310. #define USESCODEFRAGMENTS GENERATINGCFM
  311. #define USESROUTINEDESCRIPTORS GENERATINGCFM
  312. /*
  313. ***************************************************************************************************
  314.     The following macros isolate the use of inlines from the routine prototypes.
  315.     A routine prototype will always be followed by on of these inline macros with
  316.     a list of the opcodes to be inlined.  On the 68K side, the appropriate inline
  317.     code will be generated.  On platforms that use code fragments, the macros are
  318.     essentially NOPs.
  319. ***************************************************************************************************
  320. */
  321. #if CFMSYSTEMCALLS
  322. #define ONEWORDINLINE(trapNum)
  323. #define TWOWORDINLINE(w1,w2)
  324. #define THREEWORDINLINE(w1,w2,w3)
  325. #define FOURWORDINLINE(w1,w2,w3,w4)
  326. #define FIVEWORDINLINE(w1,w2,w3,w4,w5)
  327. #define SIXWORDINLINE(w1,w2,w3,w4,w5,w6)
  328. #define SEVENWORDINLINE(w1,w2,w3,w4,w5,w6,w7)
  329. #define EIGHTWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8)
  330. #define NINEWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9)
  331. #define TENWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9,w10)
  332. #define ELEVENWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11)
  333. #define TWELVEWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12)
  334. #else
  335. #define ONEWORDINLINE(trapNum) = trapNum
  336. #define TWOWORDINLINE(w1,w2) = {w1,w2}
  337. #define THREEWORDINLINE(w1,w2,w3) = {w1,w2,w3}
  338. #define FOURWORDINLINE(w1,w2,w3,w4)  = {w1,w2,w3,w4}
  339. #define FIVEWORDINLINE(w1,w2,w3,w4,w5) = {w1,w2,w3,w4,w5}
  340. #define SIXWORDINLINE(w1,w2,w3,w4,w5,w6)     = {w1,w2,w3,w4,w5,w6}
  341. #define SEVENWORDINLINE(w1,w2,w3,w4,w5,w6,w7)      = {w1,w2,w3,w4,w5,w6,w7}
  342. #define EIGHTWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8)      = {w1,w2,w3,w4,w5,w6,w7,w8}
  343. #define NINEWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9)      = {w1,w2,w3,w4,w5,w6,w7,w8,w9}
  344. #define TENWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9,w10)  = {w1,w2,w3,w4,w5,w6,w7,w8,w9,w10}
  345. #define ELEVENWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11)      = {w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11}
  346. #define TWELVEWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12)      = {w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12}
  347. #endif
  348.  
  349. #endif /* __CONDITIONALMACROS__ */
  350.  
  351.